package Movimientos;

import java.awt.Point;

import Componentes.Componente;
import TDALista.*;
import Naves.NaveEnemiga;
import Componentes.Colisionador;

public class MovBala extends Movimiento {
	
	protected boolean suspendido;
	protected PositionList<Componente> objetos;
			
	//Constructor

	public MovBala() {
		
		 super();
		 objetos = new DoubleLinkedList<Componente>();
		 suspendido = false;
	    }
	 
	//Servicios
	
	public boolean estaSuspendido() {
	   return suspendido;
	}
	
	public synchronized void suspender() {
		
	    suspendido = true;
	  try { 
		  wait();
	      }
	  catch (InterruptedException e) {
		  e.printStackTrace();
	      }
	  }
	
	public synchronized void resumir() {
		
	   notify();
	  }
		 
	 public void empezar() {
		 
	   this.start();
	 }
	 
	 public void run() {
		 
     try {     	   
    	   Colisionador<NaveEnemiga> colisionador = new Colisionador<NaveEnemiga>();
    	   if (!objetos.isEmpty()) {
    		       		
    	     Position<Componente> p = objetos.first();
    	     
             while (p != null) {
            	 
                Componente comp = p.element();
	            Point pos = comp.getLocation(); 
	            int valor = pos.y;
	            
	            valor = pos.y-comp.obtenerVelocidad();
		        pos.setLocation(pos.x,valor);
		        comp.mover(pos);
		        
	      
		       /*Comprobacion si se va de pantalla, ejecuta el destructor de bala y elimina de lista,
		        sino comprueba si colisiona con alguna nave */
		        boolean removio = false;
		       if (valor <= 1) {
		    	    	
			     comp.destruir();
			     this.removerObjeto(p);
		          }
		       
		       else  {
		    	       Componente chocado = colisionador.colision(comp,nivel.obtenerNavesEnemigas());
		    	       if(chocado != null){
		    	    	   Position<Componente> siguiente;
		    	    	   if(p!=objetos.last()){
		    	    	   siguiente = objetos.next(p);}
		    	    	   else{
		    	    		   siguiente = null;
		    	    	   }
		    	    	   this.removerObjeto(p);
		    	    	   removio = true;
		    	    	   p = siguiente;
		    	       }
		           }
		      

		       
		     if (objetos.isEmpty()) {
		    	
		    	this.suspender();
		        }
		     
		     if (suspendido) {
		    	 
		       p = objetos.first();	
		       suspendido  = false;
		      }
		     else {
		          if (p!=objetos.last() && !removio) {
		  	        p = objetos.next(p);
		            }
		          else{ MovBala.sleep(10);
		  	            p = objetos.first();
		                 }
	               }
		     
		     getGUI().repintarComponentes();
		       
	        }
             
           }
    
         }
		catch (EmptyListException | InvalidPositionException | BoundaryViolationException e) {
			System.out.println(e.getMessage());
		    }
	 	 catch (InterruptedException e ) {
	 		e.printStackTrace();
		     }
	     } 
	 
	 //Metodos para manejar la lista de Balas
	 public void removerObjeto(Position<Componente> p) {
			
		 try {
			   objetos.remove(p);
		     }
		   catch (InvalidPositionException error) {
			   System.out.println(error.getMessage());
		       }
		}
	 public void  addComponente(Componente comp){
		  
		 objetos.addLast(comp);
   
	    }
	 public boolean hayObjetos(){
			return !objetos.isEmpty();
		}
		
		
	 
}
